﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using SearchServer.AppManager;
using Persistencia;
using System.IO;

namespace SearchServer.UI
{
    public partial class AltaFse : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            mensajeError.Text = "";
            Usuario user = (Usuario)Session["Usuario_SIT"];
            if (user != null && Utilidades.Utilidades.ValidarUsuarioSesion(user))
            {
                BarraNavegacion.Text = Utilidades.Utilidades.CargarLinksVentana(user);

                if (!IsPostBack)
                {
                    if (Session["FseID"] != null)
                    {
                        lblTitulo.Text = "Editar FileSystemElement";
                        int fseId = (int)Session["FseID"];
                        FileSystemElementManager fseMgr = FileSystemElementManager.GetInstancia();
                        FileSystemElement fse = fseMgr.ObtenerFileSystemElement(fseId);
                        if (fse == null)
                        {
                            lblTitulo.Text = "Alta FileSystemElement";
                            Session["FseID"] = null;
                        }
                        else
                        {
                            txtNombre.Text = fse.Nombre + fse.Extension;
                            txtPath.Text = fse.Path;
                            chkSubCarpetas.Checked = fse.Tiene_Subcarpetas;
                            hiddenId.Value = fse.Id + "";
                        }
                    }
                    else
                    {
                        lblTitulo.Text = "Alta FileSystemElement";
                    }
                }
            }
            else
            {
                Response.Redirect("Login.aspx", false);
            }


        }

        protected void btnAgregar_Click(object sender, EventArgs e)
        {
            bool ok = ValidarDatos();
            string path = txtPath.Text;
            string nombre = txtNombre.Text;
            string pathTotal = "";

            if (path.ElementAt(path.Length - 1).Equals('\\'))
            {
                pathTotal = path + nombre;
                path = path.Remove(path.Length - 1);
            }
            else
            {
                pathTotal = path + @"\" + nombre;
            }

            if (ok)
            {
                Usuario user = (Usuario)Session["Usuario_SIT"];
                FileSystemElementManager fseMgr = FileSystemElementManager.GetInstancia();
                if (hiddenId.Value.Equals(""))
                {         
                    //Alta de FSE
                    FileSystemElement fse = new FileSystemElement();
                    if (CheckIsFile(pathTotal))
                    {
                        fse.Extension = Path.GetExtension(pathTotal);
                        fse.Nombre = Path.GetFileNameWithoutExtension(pathTotal);
                        fse.Is_File = true;
                        fse.Tiene_Subcarpetas = false;
                    }
                    else
                    {
                        fse.Extension = "";
                        fse.Nombre = Path.GetFileName(pathTotal);
                        fse.Is_File = false;
                        fse.Tiene_Subcarpetas = chkSubCarpetas.Checked;
                    }
                    fse.Tamaño = GetPathSize(pathTotal);
                    fse.Path = path;
                    fse.Fecha_Creacion = GetFechaCreacion();
                    fse.Usuario_Creacion = user.Id;
                    fse.Monitoreado = true;
                    fseMgr.IndexarFileSystemElement(fse);
                }
                else
                {
                    //Editar FSE
                    FileSystemElement fse = fseMgr.ObtenerFileSystemElement(int.Parse(hiddenId.Value));
                    if (CheckIsFile(pathTotal))
                    {
                        fse.Extension = Path.GetExtension(pathTotal);
                        fse.Nombre = Path.GetFileNameWithoutExtension(pathTotal);
                        fse.Is_File = true;
                        fse.Tiene_Subcarpetas = false;
                    }
                    else
                    {
                        fse.Extension = "";
                        fse.Nombre = Path.GetFileName(pathTotal);
                        fse.Is_File = false;
                        fse.Tiene_Subcarpetas = chkSubCarpetas.Checked;
                    }
                    fse.Tamaño = GetPathSize(pathTotal);
                    fse.Path = path;
                    fse.Fecha_Ultima_Modificacion = GetFechaCreacion();
                    fse.Usuario_Ultima_Modificacion = user.Id;
                    fse.Monitoreado = true;
                    fseMgr.ModificarIndexadoDeFileSystemElement(fse.Id, fse);
                }
                Response.Redirect("MantenimientoFse.aspx", false);
            }
        }

        private bool ValidarDatos()
        {
            if (txtNombre.Text.Trim().Equals("") || txtPath.Text.Trim().Equals(""))
            {
                mensajeError.Text = "No pueden haber campos vacios.";
                return false;
            }
            else
            {
                string path = txtPath.Text;
                string nombre = txtNombre.Text;
                string pathTotal = "";

                if (path.ElementAt(path.Length - 1).Equals('\\'))
                {
                    pathTotal = path + nombre;
                }
                else
                {
                    pathTotal = path + @"\" + nombre;
                }

                if (!Directory.Exists(pathTotal))
                {
                    if (!File.Exists(pathTotal))
                    {
                        mensajeError.Text = "El Path total especificado no existe.";
                        return false;
                    }
                }
            }

            return true;
        }


        private bool CheckIsFile(string path)
        {
            bool isFile = !((File.GetAttributes(path) & FileAttributes.Directory)
                 == FileAttributes.Directory);
            return isFile;
        }

        private int GetPathSize(string path)
        {
            long tamano = 0;

            if (CheckIsFile(path))
            {
                FileInfo f = new FileInfo(path);
                tamano = f.Length;
            }
            else
            {
                tamano = GetDirectorySize(path);
            }

            return (int)tamano;
        }

        private long GetDirectorySize(string rootdir)
        {
            try
            {
                long dirSize = 0;
                DirectoryInfo[] DI = new DirectoryInfo(rootdir).GetDirectories("*.*", SearchOption.AllDirectories);
                FileInfo[] FI = new DirectoryInfo(rootdir).GetFiles("*.*", SearchOption.AllDirectories);
                foreach (FileInfo file in FI)
                {
                    dirSize += file.Length;
                }

                return dirSize;
            }
            catch (DirectoryNotFoundException)
            {
            }
            catch (Exception)
            {
            }

            return 0;
        }

        private DateTime GetFechaCreacion()
        {
            TimeMgr.TimeMgr mgr = new TimeMgr.TimeMgr();
            return mgr.ObtenerFecha();
        }
    }
}